# encoding: UTF-8

class Dados::Exame < ActiveRecord::Base

  belongs_to :paciente,       :class_name => "Usuarios::Paciente"
  has_many   :ecgs,           :class_name => "Dados::Ecg"
  has_many   :acelerometros,  :class_name => "Dados::Acelerometro"

  def self.notificar
    Dados::Exame.where(:notificar => true).each do |exame|
      exame.paciente.permissoes.where(:notificar => true).each do |permissao|
        UsuarioMailer.novo_exame(permissao.medico, permissao.paciente).deliver
      end
      exame.notificar = false
      exame.save
    end
  end

  def atualizar_dados(dados)
    begin
      ActiveRecord::Base.transaction do
        if dados[:dados_ecg]
          if not Dados::Ecg.criar_dados(self, dados[:dados_ecg])
            raise "Erro ao salvar dados de ECG"
          end
        end
        if dados[:dados_acel]
          if not Dados::Acelerometro.criar_dados(self, dados[:dados_acel])
            raise "Erro ao salvar dados de Acelerometro"
          end
        end
      end
      return ""
    rescue
      # Retorna a mensagem de erro associada
      return $!
    end
  end

  def atualizar(comentarios)
    self.comentarios = comentarios
    self.save
  end

  def ecg_chart_completo
    montar_ecg_chart(self.ecgs.order("intervalo"))
  end

  def ecg_chart_ultimos(inicio)
    montar_ecg_chart(self.ecgs.where("intervalo > ?", inicio).order("intervalo"))
  end

  def acel_chart_completo
    montar_acel_chart(self.acelerometros.order("intervalo"))
  end

  def acel_chart_ultimos(inicio)
    montar_acel_chart(self.acelerometros.where("intervalo > ?", inicio).order("intervalo"))
  end

  private

  def montar_ecg_chart(lista_ecgs)
    chart = {}
    dados_chart_1 = []
    dados_chart_2 = []
    dados_chart_3 = []
    y1_min = 1.0/0 # Infinito
    y2_min = 1.0/0 # Infinito
    y3_min = 1.0/0 # Infinito
    y1_max = 0
    y2_max = 0
    y3_max = 0
    x_max = 0
    lista_ecgs.each do |ecg|
      dados_chart_1.push([ecg.intervalo, ecg.derivacao_1])
      dados_chart_2.push([ecg.intervalo, ecg.derivacao_2])
      dados_chart_3.push([ecg.intervalo, ecg.derivacao_3])
      x_max = ecg.intervalo if x_max < ecg.intervalo
      y1_min = ecg.derivacao_1 if y1_min > ecg.derivacao_1
      y2_min = ecg.derivacao_2 if y2_min > ecg.derivacao_2
      y3_min = ecg.derivacao_3 if y3_min > ecg.derivacao_3
      y1_max = ecg.derivacao_1 if y1_max < ecg.derivacao_1
      y2_max = ecg.derivacao_2 if y2_max < ecg.derivacao_2
      y3_max = ecg.derivacao_3 if y3_max < ecg.derivacao_3
    end
    chart[:xTick] = 1142
    chart[:xMax] = x_max
    chart[:grafico1] = {}
    chart[:grafico1][:data] = dados_chart_1
    chart[:grafico1][:label] = "LL-RA"
    chart[:grafico1][:yMax] = y1_max
    chart[:grafico1][:yMin] = y1_min
    chart[:grafico2] = {}
    chart[:grafico2][:data] = dados_chart_2
    chart[:grafico2][:label] = "LL-LA"
    chart[:grafico2][:yMax] = y2_max
    chart[:grafico2][:yMin] = y2_min
    chart[:grafico3] = {}
    chart[:grafico3][:data] = dados_chart_3
    chart[:grafico3][:label] = "LA-RA"
    chart[:grafico3][:yMax] = y3_max
    chart[:grafico3][:yMin] = y3_min
    chart[:comentarios] = self.comentarios
    return chart
  end

  def montar_acel_chart(lista_acel)
    chart = {}
    dados_chart_1 = []
    dados_chart_2 = []
    dados_chart_3 = []
    y1_min = 1.0/0 # Infinito
    y2_min = 1.0/0 # Infinito
    y3_min = 1.0/0 # Infinito
    y1_max = 0
    y2_max = 0
    y3_max = 0
    x_max = 0
    lista_acel.each do |acel|
      dados_chart_1.push([acel.intervalo, acel.eixo_x])
      dados_chart_2.push([acel.intervalo, acel.eixo_y])
      dados_chart_3.push([acel.intervalo, acel.eixo_z])
      x_max = acel.intervalo if x_max < acel.intervalo
      y1_min = acel.eixo_x if y1_min > acel.eixo_x
      y2_min = acel.eixo_y if y2_min > acel.eixo_y
      y3_min = acel.eixo_z if y3_min > acel.eixo_z
      y1_max = acel.eixo_x if y1_max < acel.eixo_x
      y2_max = acel.eixo_y if y2_max < acel.eixo_y
      y3_max = acel.eixo_z if y3_max < acel.eixo_z
    end
    chart[:xTick] = 1142
    chart[:xMax] = x_max
    chart[:grafico1] = {}
    chart[:grafico1][:data] = dados_chart_1
    chart[:grafico1][:label] = "Eixo X"
    chart[:grafico1][:yMax] = y1_max
    chart[:grafico1][:yMin] = y1_min
    chart[:grafico2] = {}
    chart[:grafico2][:data] = dados_chart_2
    chart[:grafico2][:label] = "Eixo Y"
    chart[:grafico2][:yMax] = y2_max
    chart[:grafico2][:yMin] = y2_min
    chart[:grafico3] = {}
    chart[:grafico3][:data] = dados_chart_3
    chart[:grafico3][:label] = "Eixo Z"
    chart[:grafico3][:yMax] = y3_max
    chart[:grafico3][:yMin] = y3_min
    chart[:comentarios] = self.comentarios
    return chart
  end

end
